#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <dirent.h>  // 用于目录操作
#include "get_device_id.h" // 包含自定义的头文件

#define DEVICE_DIR "/sys/bus/w1/devices/" // DS18B20 设备所在目录
#define PREFIX "28-"                      // 设备目录前缀

// 读取 DS18B20 传感器设备ID的函数
int get_device_id(char *id, int size)
{
    int fd = -1;         // 文件描述符初始化
    char buf[128];       // 缓冲区，用于存储读取的数据
    char device_path[256]; // 存储完整的设备文件路径
    char *ptr = NULL;    // 字符指针，用于查找温度数据
    DIR *dir;            // 用于遍历目录
    struct dirent *entry;

    // 打开设备目录
    dir = opendir(DEVICE_DIR);
    if (!dir)
    {
        printf("无法打开目录 %s: %s,获取设备id失败\n", DEVICE_DIR, strerror(errno));
        return -1;
    }

    // 查找以 "28-" 开头的目录
    while ((entry = readdir(dir)) != NULL)
    {
        if (strncmp(entry->d_name, PREFIX, strlen(PREFIX)) == 0)
        {
            // 构造完整的设备文件路径
            snprintf(device_path, sizeof(device_path), "%s%s/w1_slave", DEVICE_DIR, entry->d_name);
            printf("找到设备路径: %s\n", device_path);
            break;
        }
    }
    closedir(dir);

    // 如果没有找到以 "28-" 开头的设备
    if (!entry)
    {
        printf("未找到以 %s 开头的设备,获取设备id失败\n", PREFIX);
        return -1;
    }

    // 打开设备文件
    fd = open(device_path, O_RDONLY);
    if (fd < 0)
    {
        printf("无法打开文件 %s: %s,获取设备id失败\n", device_path, strerror(errno));
        return -1;
    }

    // 清空缓冲区
    memset(buf, 0, sizeof(buf));

    // 读取文件内容
    if (read(fd, buf, sizeof(buf) - 1) < 0)
    {
        printf("读取数据失败: %s,获取设备id失败\n", strerror(errno));
        close(fd); // 关闭文件
        return -1;
    }

  
    // 查找 "t="，如果找到则复制设备ID
    ptr = strstr(buf, "t=");
    if (!ptr)
    {
        printf("未找到 't=' 字符串,获取设备id失败\n");
        close(fd); // 关闭文件
        return -1;
    }

    // 如果找到 "t="，则复制设备ID到传入的 id 数组
    strncpy(id, "iot-guhe-001\0", size); // 复制设备ID
    printf("设备ID: %s\n", id); // 打印设备ID

    close(fd); // 关闭文件

    return 1; // 成功返回 0
}

